package com.xpu.demo;

import java.util.Stack;

/**
 * 编写一个类，用两个栈实现队列，支持队列的基本操作
 * 队列特性：先进先出
 */
public class TwoStackQueue {
    /**
     * 分析思路：栈的特点是先进后出，而队列先进先出。所以我们可以把两个栈顺序反过来实现队列的基本操作
     * 具体实现是一个栈只作为压入栈，压入数据时只往这个栈中压入记为stackPush
     * 另一个栈值作为弹出栈，在弹出数据时只在这个栈中弹出，记为stackPop
     * 具体实现时，必须做到以下两点：
     * 1.如果stackPush要往StackPop中压入数据，那么必须一次性把stackPush全部压入
     * 2.如果stackPop栈不为空，stackPush绝不能向stackPOp中压入数据
     */
    private Stack<Integer> stackPush;
    private Stack<Integer> stackPop;

    public TwoStackQueue(Stack<Integer> stackPush, Stack<Integer> stackPop) {
        this.stackPush = stackPush;
        this.stackPop = stackPop;
    }
    //push栈向pop栈倒入数据
    private void pushToPop(){
        if(stackPop.empty()){
            while (!stackPush.empty()){
                stackPop.push(stackPush.pop());
            }
        }
    }
    public void add(int pushInt){
        stackPush.push(pushInt);
        pushToPop();
    }
    public int poll(){
        if(stackPop.empty()&&stackPush.empty()){
            throw new RuntimeException("Queue is empty.");
        }
        pushToPop();//点睛之笔
        return stackPop.pop();
    }
    public int peek(){
        if(stackPop.empty()&&stackPush.empty()){
            throw new RuntimeException("Queue is empty.");
        }
        pushToPop();
        return stackPop.peek();
    }
}
